home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #3
/
Amiga Plus CD - 1997 - No. 03.iso
/
pd
/
programmierung
/
alienbreed3d2_src
/
editshadow.s
< prev
next >
Wrap
Text File
|
1997-01-31
|
46KB
|
3,155 lines
* the 'Hello World' program in 68000 Assembler
* the C version can be found in the Intuition manual
* this source code (C) HiSoft 1992 All Rights Reserved
* for Devpac Amiga Version 2 the following symbols were changed
* to avoid clashes with the new include files:
* Screen->MyScreen, NewScreen->MyNewScreen
* Window->MyWindow, NewWindow->MyNewWindow
opt c+,d+
include workbench:utilities/devpac/system use pre-assembled header
include exec/exec_lib.i
include intuition/intuition.i
include intuition/intuition_lib.i
include graphics/graphics_lib.i
include graphics/text.i
INTUITION_REV equ 31 v1.1
GRAPHICS_REV equ 31 v1.1
* Open the intuition library
moveq #100,d4 default error return code
moveq #INTUITION_REV,d0 version
lea int_name(pc),a1
CALLEXEC OpenLibrary
tst.l d0
beq exit_false if failed then quit
move.l d0,_IntuitionBase else save the pointer
moveq #GRAPHICS_REV,d0
lea graf_name(pc),a1
CALLEXEC OpenLibrary
tst.l d0
; beq exit_closeint if failed then close Int, exit
move.l d0,_GfxBase
lea MyNewScreen(pc),a0
CALLINT OpenScreen open a screen
tst.l d0
; beq exit_closeall if failed the close both, exit
move.l d0,MyScreen
move.l MyScreen,a0
lea sc_BitMap(a0),a0
lea bm_Planes(a0),a0
move.l #RAWSCRN,(a0)
move.l #RAWSCRN+10240,4(a0)
move.l #RAWSCRN+10240*2,8(a0)
move.l #RAWSCRN+10240*3,12(a0)
move.l #RAWSCRN+10240*4,16(a0)
move.l #RAWSCRN+10240*5,20(a0)
move.l #RAWSCRN+10240*6,24(a0)
move.l #RAWSCRN+10240*7,28(a0)
* now initialise a NewWindow structure. This is normally easier to
* do with dc.w/dc.l statement etc, but for comparison with the C
* version we do it like this
lea MyNewWindow(pc),a0 good place to start
move.w #20,nw_LeftEdge(a0)
move.w #20,nw_TopEdge(a0)
move.w #300,nw_Width(a0)
move.w #100,nw_Height(a0)
move.b #0,nw_DetailPen(a0)
move.b #1,nw_BlockPen(a0)
move.l #window_title,nw_Title(a0)
_temp set WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
move.l #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
move.l #CLOSEWINDOW,nw_IDCMPFlags(a0)
move.w #CUSTOMSCREEN,nw_Type(a0)
clr.l nw_FirstGadget(a0)
clr.l nw_CheckMark(a0)
move.l MyScreen(pc),nw_Screen(a0)
clr.l nw_BitMap(a0)
move.w #100,nw_MinWidth(a0)
move.w #25,nw_MinHeight(a0)
move.w #640,nw_MaxWidth(a0)
move.w #200,nw_MaxHeight(a0)
* thats it set up, now open the window (a0=NewWindow already)
; CALLINT OpenWindow
; tst.l d0
; beq exit_closescr if failed
; move.l d0,MyWindow save it
;
; move.l d0,a1 window
; move.l wd_RPort(a1),a1 rastport
; moveq #20,d0 X
; moveq #20,d1 Y
; CALLGRAF Move move the cursor
;
; move.l MyWindow(pc),a0
; move.l wd_RPort(a0),a1 rastport
; lea hello_message(pc),a0
; moveq #11,d0
; CALLGRAF Text print something
;
; move.l MyWindow(pc),a0
; move.l wd_UserPort(a0),a0
; move.b MP_SIGBIT(a0),d1 (misprint in manual)
; moveq #0,d0
; bset d1,d0 do a shift
; CALLEXEC Wait
; moveq #0,d4 return code
* various exit routines that do tidying up, given a return code in d4
; move.l MyWindow(pc),a0
; CALLINT CloseWindow
;exit_closescr
; move.l MyScreen(pc),a0
; CALLINT CloseScreen
;exit_closeall
; move.l _GfxBase(pc),a1
; CALLEXEC CloseLibrary
;exit_closeint
; move.l _IntuitionBase(pc),a1
; CALLEXEC CloseLibrary
;done:
; bra done
move.l #PALETTEBIT,a0
move.l #COPIEDPAL+4,a1
move.w #255,d0
copydown:
move.b 1(a0),(a1)
move.b 3(a0),4(a1)
move.b 5(a0),8(a1)
add.w #6,a0
add.w #12,a1
dbra d0,copydown
move.w #256,COPIEDPAL
move.w #0,COPIEDPAL+2
LOOKFORME:
move.l MyScreen,a0
lea sc_ViewPort(a0),a0
move.l #COPIEDPAL,a1
move.l _GfxBase,a6
jsr -$372(a6)
move.l MyScreen,a4
move.w sc_MouseX(a4),d0
move.w sc_MouseY(a4),d1
move.w d0,OLDXM
move.w d1,OLDYM
loop:
move.l #POLYGONDATA,a3
move.w (a3)+,SORTIT
move.l a3,START_OF_OBJECT
move.w (a3)+,num_points
move.w (a3)+,d6
move.w d6,num_frames
move.l a3,POINTER_TO_POINTERS
lea (a3,d6.w*4),a3
move.l a3,LinesPtr
moveq #0,d5
moveq #0,d2
move.l POINTER_TO_POINTERS,a4
move.w (a4,d5.w*4),d2
add.l START_OF_OBJECT,d2
move.l d2,PtsPtr
move.w 2(a4,d5.w*4),d5
add.l START_OF_OBJECT,d5
move.l d5,PolyAngPtr
move.l d2,a3
move.w num_points,d5
move.l (a3)+,OBJONOFF
move.l a3,PointAngPtr
add.w d5,d5
move.w d5,d2
add.w d5,d5
add.w d5,d2
add.w d2,a3
move.l a3,PtsPtr
move.l MyScreen,a4
move.w sc_MouseX(a4),d0
move.w sc_MouseY(a4),d1
sub.w OLDXM,d0
sub.w OLDYM,d1
add.w d0,OLDXM
add.w d1,OLDYM
btst #6,$bfe001
beq.s .SHIFTABOUT
muls #8190,d0
divs #160,d0
add.w d0,YANG
and.w #8190,YANG
muls #8190,d1
divs #160,d1
and.w #8190,d1
add.w d1,XANG
and.w #8190,XANG
; add.w #40,AANG
; add.w #70,BANG
; and.w #8191,AANG
; and.w #8191,BANG
; add.w #60,CANG
; add.w #90,DANG
; and.w #8191,CANG
; and.w #8191,DANG
bra .ROTABOUT
.SHIFTABOUT
muls #8190,d0
divs #160,d0
add.w d0,BANG
and.w #8190,BANG
muls #8190,d1
divs #160,d1
and.w #8190,d1
add.w d1,AANG
and.w #8190,AANG
.ROTABOUT
move.w AANG,d1
move.w BANG,d3
; cmp.w #2,d6
; bne.s .notsecrot
; move.w CANG,d1
; move.w DANG,d3
;.notsecrot
move.l #SINETABLE,a1
move.w (a1,d1.w),XSIN ;xsin
move.w (a1,d3.w),YSIN ;ysin
add.w #2048,a1
move.w (a1,d1.w),XCOS ;xcos
move.w (a1,d3.w),YCOS ;ycos
move.w XANG,d1
move.w YANG,d3
; cmp.w #2,d6
; bne.s .notsecrot
; move.w CANG,d1
; move.w DANG,d3
;.notsecrot
move.l #SINETABLE,a1
move.w (a1,d1.w),XSIN2 ;xsin
move.w (a1,d3.w),YSIN2 ;ysin
add.w #2048,a1
move.w (a1,d1.w),XCOS2 ;xcos
move.w (a1,d3.w),YCOS2 ;ycos
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
*SHADOW BUFFER CALCULATION
; First, calculate the normal brightnesses
; for points. NB: -1,-1,-1 = this point not used
; in gouraud shading.
move.l #NORMBRIGHTS,a2
move.l PointAngPtr,a0
move.w num_points,d7
move.l #NORMVECTS,a5
subq #1,d7
CALCNORMBRIGHTS:
move.w (a0)+,d0
move.w (a0)+,d1
move.w (a0)+,d2
move.w #0,d6
cmp.w #-1,d0
bne.s .notnot
cmp.w #-1,d1
bne.s .notnot
cmp.w #-1,d2
bne.s .notnot
move.w #-1,x1
move.w #-1,y1
move.w #-1,z1
bra .dontbother
.notnot:
neg.w d1
move.w d0,d3
move.w d2,d5
muls YCOS,d0
muls YSIN,d2
sub.l d2,d0
add.l d0,d0
swap d0
; asr.l #6,d0 ; new x*512
muls YSIN,d3
muls YCOS,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS,d1
muls XSIN,d2
sub.l d2,d1
add.l d1,d1
swap d1
muls XSIN,d4
muls XCOS,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
move.w d0,d3
move.w d2,d5
muls YCOS2,d0
muls YSIN2,d2
sub.l d2,d0
add.l d0,d0
swap d0
muls YSIN2,d3
muls YCOS2,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS2,d1
muls XSIN2,d2
sub.l d2,d1
add.l d1,d1
swap d1
muls XSIN2,d4
muls XCOS2,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d0,x1
move.w d1,y1
move.w d4,z1
move.w d1,d6 ; new y
asr.w #4,d6
add.w #20,d6
ble.s .okokok
moveq #0,d6
.okokok:
add.w #$1c,d6
bge.s .okokokok
moveq #0,d6
.okokokok:
add.w #32,d6
;
; cmp.w #28,d6
; blt.s .okbig
; move.w #28,d6
;.okbig
.dontbother:
move.w x1,(a5)+
move.w y1,(a5)+
move.w z1,(a5)+
move.w d6,(a2)+
dbra d7,CALCNORMBRIGHTS
; Next, calculate the point coords for
; the shadow buffer.
move.l #SHADOWPTS,a2
move.l PtsPtr,a0
move.w num_points,d7
subq #1,d7
ROTPTLOPSHAD:
move.w (a0)+,d0
move.w d0,d3
move.w (a0)+,d1
move.w (a0)+,d2
move.w d2,d5
muls YCOS,d0
muls YSIN,d2
sub.l d2,d0
add.l d0,d0
swap d0
; asr.l #6,d0 ; new x*512
muls YSIN,d3
muls YCOS,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS,d1
muls XSIN,d2
sub.l d2,d1
add.l d1,d1
swap d1
muls XSIN,d4
muls XCOS,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
move.w d0,d3
move.w d2,d5
muls YCOS2,d0
muls YSIN2,d2
sub.l d2,d0
asr.l #6,d0 ; new x*512
muls YSIN2,d3
muls YCOS2,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS2,d1
muls XSIN2,d2
sub.l d2,d1
asr.l #6,d1 ; new y*512
muls XSIN2,d4
muls XCOS2,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
ext.l d2
move.w XOFF,d5
ext.l d5
asl.l #8,d5
add.l d5,d5
add.l d5,d0
move.l d0,(a2)+
move.l d1,(a2)+
move.w d2,(a2)+
dbra d7,ROTPTLOPSHAD
***************************************
* Calculate viewer position for specularity..
move.w #0,d0
move.w #0,d1
move.w #-1024,d2
; move.w d0,d3
; move.w d2,d5
;
; muls YCOS,d0
; muls YSIN,d2
; sub.l d2,d0
; add.l d0,d0
; swap d0
; asr.l #6,d0 ; new x*512
;
; muls YSIN,d3
; muls YCOS,d5
; add.l d5,d3
; add.l d3,d3
; swap d3
; move.w d3,d2 ; new z
;
; move.w d1,d4
; move.w d2,d5
; muls XCOS,d1
; muls XSIN,d2
; sub.l d2,d1
; add.l d1,d1
; swap d1
;
; muls XSIN,d4
; muls XCOS,d5
; add.l d5,d4
; add.l d4,d4
; swap d4
; move.w d4,d2 ; new z
move.w d0,d3
move.w d2,d5
muls YCOS2,d0
muls YSIN2,d2
sub.l d2,d0
add.l d0,d0
swap d0
muls YSIN2,d3
muls YCOS2,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS2,d1
muls XSIN2,d2
sub.l d2,d1
add.l d1,d1
swap d1
; asr.l #6,d1 ; new y*512
muls XSIN2,d4
muls XCOS2,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d0,x2b
move.w d1,y2b
move.w d4,z2b
; Now the specular highlight efforts....
move.l #SPECBRIGHTS,a2
move.l #NORMVECTS,a1
move.l #SHADOWPTS,a5
move.w num_points,d7
subq #1,d7
CALCSPECBRIGHTS:
move.w (a1)+,x1
move.w (a1)+,y1
move.w (a1)+,z1
move.w x2b,d0
move.l (a5)+,d1
asr.l #8,d1
asr.l #1,d1
sub.w d1,d0
move.w d0,x2
move.w y2b,d0
move.l (a5)+,d1
asr.l #8,d1
asr.l #1,d1
sub.w d1,d0
move.w d0,y2
move.w z2b,d0
sub.w (a5)+,d0
move.w d0,z2
move.w #0,d6
cmp.w #-1,x1
bne.s .notnot
cmp.w #-1,y1
bne.s .notnot
cmp.w #-1,z1
beq .dontbother
.notnot:
move.w x2,d2
muls d2,d2
move.w y2,d1
muls d1,d1
add.l d1,d2
move.w z2,d1
muls d1,d1
add.l d1,d2
jsr CALCSQROOT
move.w d2,l2
move.w y1,d0
muls z2,d0
move.w y2,d1
muls z1,d1
sub.l d1,d0 ; x4
; move.w z1,d1
; muls x2,d1
; move.w z2,d2
; muls x1,d2
; sub.l d2,d1 ; y4
move.w x1,d2
muls y2,d2
move.w x2,d3
muls y1,d3
sub.l d3,d2 ; z4
asr.l #8,d0
; asr.l #8,d1
asr.l #8,d2
asr.l #2,d0
; asr.l #2,d1
asr.l #2,d2
; move.w x1,d3
; muls d1,d3
; move.w y1,d4
; muls d0,d4
; sub.l d4,d3
; asr.l #8,d3
; asr.l #1,d3
; add.w z2,d3
move.w z1,d3
muls d0,d3
move.w x1,d4
muls d2,d4
sub.l d4,d3
add.l d3,d3
divs l2,d3
; asr.l #8,d3
; asr.l #1,d3
add.w y2,d3
move.w d3,d6
asr.w #4,d6
add.w #30,d6
ble.s .okokok
moveq #0,d6
.okokok:
add.w #$1c,d6
bge.s .okokokok
moveq #0,d6
.okokokok:
muls d6,d6
asr.w #5,d6
;
; cmp.w #28,d6
; blt.s .okbig
; move.w #28,d6
;.okbig
.dontbother:
move.w d6,(a2)+
dbra d7,CALCSPECBRIGHTS
* NOW THE POINTS FOR ON-SCREENNESS
move.l #ROTATEDPTS,a2
move.l PtsPtr,a0
move.w num_points,d7
subq #1,d7
ROTPTLOP:
move.w (a0)+,d0
move.w d0,d3
move.w (a0)+,d1
move.w (a0)+,d2
move.w d2,d5
muls YCOS,d0
muls YSIN,d2
sub.l d2,d0
asr.l #6,d0 ; new x*512
muls YSIN,d3
muls YCOS,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS,d1
muls XSIN,d2
sub.l d2,d1
asr.l #6,d1 ; new y*512
muls XSIN,d4
muls XCOS,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
ext.l d2
move.w XOFF,d5
ext.l d5
asl.l #8,d5
add.l d5,d5
add.l d5,d0
move.l d0,(a2)+
move.l d1,(a2)+
move.w d2,(a2)+
dbra d7,ROTPTLOP
; Now convert the rotated points to the screen:
move.l #ROTATEDPTS,a0
move.l #ONSCREENPTS,a2
move.w num_points,d7
subq #1,d7
CONVERTTOSCREEN:
move.l (a0)+,d0
move.l (a0)+,d1
move.w (a0)+,d2
add.w ZOFF,d2
ext.l d2
move.l d0,d3
asr.l #1,d3
add.l d3,d0
move.l d1,d3
asr.l #1,d3
add.l d3,d1
divs d2,d0
divs d2,d1
add.w #160*4,d0
add.w #128*4,d1
move.w d0,(a2)+
move.w d1,(a2)+
dbra d7,CONVERTTOSCREEN
move.w #254,HIGHPOLY
move.l LinesPtr,a1
move.l #PartBuffer,a0
move.l a0,a2
move.w #15,d0
clrpartbuffSHAD:
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
dbra d0,clrpartbuffSHAD
move.l #SHADOWPTS,a2
move.l OBJONOFF,d5
move.w #0,d4
tst.w SORTIT
bne.s PutInPartsSHAD
putinunsortedSHAD:
move.w (a1)+,d7
blt doneallpartsSHAD
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra putinunsortedSHAD
.yeson:
move.w (a1)+,d6
move.l #0,(a0)+
move.w d7,(a0)+
move.w d4,(a0)+
addq #1,d4
bra putinunsortedSHAD
PutInPartsSHAD
move.w (a1)+,d7
blt doneallpartsSHAD
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra PutInPartsSHAD
.yeson:
move.w (a1)+,d6
move.l 4(a2,d6.w),d0
add.l #200000,d0
move.l #PartBuffer-8,a0
stillfrontSHAD
addq #8,a0
cmp.l (a0),d0
blt stillfrontSHAD
move.l #endparttab-8,a5
domoreshiftSHAD:
move.l -8(a5),(a5)
move.l -4(a5),4(a5)
subq #8,a5
cmp.l a0,a5
bgt.s domoreshiftSHAD
move.l d0,(a0)
move.w d7,4(a0)
move.w d4,6(a0)
addq #1,d4
bra PutInPartsSHAD
doneallpartsSHAD:
move.l #PartBuffer,a0
PartLoopSHAD
move.l (a0)+,d7
blt nomorepartsSHAD
move.l #SAVEHIGHS,a2
move.w 2(a0),d0
move.w HIGHPOLY,(a2,d0.w*2)
moveq #0,d0
move.w (a0),d0
addq #4,a0
add.l START_OF_OBJECT,d0
move.l d0,a1
polylooSHAD:
tst.w (a1)
blt.s nomorepolysSHAD
movem.l a0/a1/d7,-(a7)
bsr doaSHADEpoly
movem.l (a7)+,a0/a1/d7
move.w (a1),d0
lea 18(a1,d0.w*4),a1
bra.s polylooSHAD
nomorepolysSHAD:
sub.w #1,HIGHPOLY
bra PartLoopSHAD
nomorepartsSHAD:
*******************************************
* Now the on-screen bit...
*******************************************
move.l LinesPtr,a1
move.l #PartBuffer,a0
move.l a0,a2
move.w #15,d0
clrpartbuff:
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
dbra d0,clrpartbuff
move.l #ROTATEDPTS,a2
move.l OBJONOFF,d5
moveq #0,d4
tst.w SORTIT
bne.s PutInParts
putinunsorted:
move.w (a1)+,d7
blt doneallparts
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra putinunsorted
.yeson:
move.w (a1)+,d6
move.l #0,(a0)+
move.w d7,(a0)+
move.w d4,(a0)+
addq #1,d4
bra putinunsorted
PutInParts
move.w (a1)+,d7
blt doneallparts
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra PutInParts
.yeson:
move.w (a1)+,d6
move.l (a2,d6.w),d0
asr.l #8,d0
asr.l #2,d0
muls d0,d0
move.l 4(a2,d6.w),d2
asr.l #8,d2
asr.l #2,d2
muls d2,d2
add.l d2,d0
move.w 8(a2,d6.w),d2
add.w #1024,d2
muls d2,d2
add.l d2,d0
move.l #PartBuffer-8,a0
stillfront
addq #8,a0
cmp.l (a0),d0
blt stillfront
move.l #endparttab-8,a5
domoreshift:
move.l -8(a5),(a5)
move.l -4(a5),4(a5)
subq #8,a5
cmp.l a0,a5
bgt.s domoreshift
move.l d0,(a0)
move.w d7,4(a0)
move.w d4,6(a0)
addq #1,d4
bra PutInParts
doneallparts:
move.l #PartBuffer,a0
PartLoop
move.l (a0)+,d7
blt nomoreparts
move.l #SAVEHIGHS,a2
move.w 2(a0),d0
move.w (a2,d0.w*2),HIGHPOLY
moveq #0,d0
move.w (a0),d0
addq #4,a0
add.l START_OF_OBJECT,d0
move.l d0,a1
polyloo:
tst.w (a1)
blt.s nomorepolys
movem.l a0/a1/d7,-(a7)
bsr doapoly
movem.l (a7)+,a0/a1/d7
move.w (a1),d0
lea 18(a1,d0.w*4),a1
bra.s polyloo
nomorepolys:
sub.w #1,HIGHPOLY
bra PartLoop
nomoreparts:
NOPOLYS:
; btst #6,$bfe001
; beq.s .SHOWSHADOW
move.l FASTBUFFER,a0
add.l #40*320+64,a0
move.l #RAWSCRN+40*40+8,a1
move.l #(24)-1,d0
move.l #175,d1
move.w #128,d2
move.w #16,d3
moveq #0,d4
moveq #0,d5
jsr CHUNKYTOPLANAR
bra .SHOWNSCRN
.SHOWSHADOW
move.l #SHADOWBUFFER,a0
add.l #40*256,a0
move.l #RAWSCRN+40*40,a1
move.l #(256/8)-1,d0
move.l #175,d1
move.w #0,d2
move.w #8,d3
moveq #0,d4
moveq #0,d5
jsr CHUNKYTOPLANAR
.SHOWNSCRN:
move.l FASTBUFFER,a0
move.l #NEBBIE,a1
add.l #40*320+64,a0
move.w #175,d0
clrchunk:
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
add.w #(320-192),a0
dbra d0,clrchunk
move.l #SHADOWBUFFER,a0
move.l #-1,d1
move.l #-1,d2
move.w #15,d0
;clrshad:
; move.w #15,d5
;innner
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; dbra d5,innner
; exg d1,d2
;
; dbra d0,clrshad
btst #7,$bfe001
beq.s exit_closescr
add.l #$8000,lmxoff
cmp.l #40*65536,lmxoff
blt.s .oksm
sub.l #40*65536,lmxoff
.oksm
bra loop
lmxoff: dc.l 0
exit_closescr
move.l MyScreen(pc),a0
CALLINT CloseScreen
exit_closeall
move.l _GfxBase(pc),a1
CALLEXEC CloseLibrary
exit_closeint
move.l _IntuitionBase(pc),a1
CALLEXEC CloseLibrary
exit_false
move.l #0,d0 return code
rts
TESTTAB: ds.w 30
************************************************
* SUBROUTINES HERE. ****************************
************************************************
**********************************************************
* the definition of the screen - note that in assembler you
* MUST get the sizes of these fields correct, by consulting either
* the RKM or the header files
MyNewScreen dc.w 0,0 left, top
dc.w 320,256 width, height
dc.w 8 depth
dc.b 0,1 pens
dc.w 0 viewmodes
dc.w CUSTOMSCREEN type
dc.l MyFont font
dc.l screen_title title
dc.l 0 gadgets
dc.l 0 bitmap
* my font definition
MyFont dc.l font_name
dc.w TOPAZ_SIXTY
dc.b FS_NORMAL
dc.b FPF_ROMFONT
* the variables
_IntuitionBase dc.l 0 Intuition lib pointer
_GfxBase dc.l 0 graphics lib pointer
MyScreen dc.l 0
MyWindow dc.l 0
MyNewWindow ds.b nw_SIZE a buffer
* some strings
int_name INTNAME
graf_name GRAFNAME
hello_message dc.b 'Hello World'
* these are C strings, so have to be null terminated
screen_title dc.b 'My Own Screen',0
font_name dc.b 'topaz.font',0
window_title dc.b 'A Simple Window',0
even
doaSHADEpoly:
move.w (a1)+,d7 ; sides to draw
addq #2,a1 ; avoid holes
move.l #SHADOWPTS,a3
move.w (a1),d0
move.w 4(a1),d1
move.w 8(a1),d2
muls #10,d0
muls #10,d1
muls #10,d2
move.w 8(a3,d0.w),d3
move.w 8(a3,d1.w),d4
move.w 8(a3,d2.w),d5
move.l (a3,d0.w),d0
move.l (a3,d1.w),d1
move.l (a3,d2.w),d2
asr.l #8,d0
asr.l #8,d1
asr.l #8,d2
asr.l #1,d0
asr.l #1,d1
asr.l #1,d2
sub.w d1,d0
sub.w d1,d2
sub.w d4,d3
sub.w d4,d5
muls d3,d2
muls d5,d0
sub.l d0,d2
bge SHADpolybehind
move.w #20000,d4 ; top
move.w #-20000,d5 ; bottom
move.l #UVCOORDS,a4
putinlinesSHAD:
move.w (a1),d0
move.w 4(a1),d1
moveq #0,d2
move.b 2(a1),d2 ; one end U
move.w d2,2(a4,d0.w*4)
move.b 3(a1),d2 ; one end V
move.w d2,(a4,d0.w*4)
move.b 6(a1),d2 ; two end U
move.w d2,2(a4,d1.w*4)
move.b 7(a1),d2 ; two end V
move.w d2,(a4,d1.w*4)
move.w d0,d2
muls #10,d2
move.w 8(a3,d2.w),d2 ; Z
cmp.w d2,d4
ble.s .oktop
move.w d2,d4
.oktop
cmp.w d2,d5
bge.s .okbot
move.w d2,d5
.okbot
movem.l d4/d5/d7/a1/a3/a4,-(a7)
bsr SIMPLESHADLINE
movem.l (a7)+,d4/d5/d7/a1/a3/a4
addq #4,a1
dbra d7,putinlinesSHAD
addq #4,a1
move.w (a1)+,TEXTUREADD
asr.w #2,d4
asr.w #2,d5
add.w #128,d4
add.w #128,d5
move.w d4,TOPLINE
move.w d5,BOTLINE
* Now draw the shadow polygon....
move.l #SHADOWBUFFER,a2
move.l #LEFTUVS,a0
move.w TOPLINE,d0
move.w BOTLINE,d1
sub.w d0,d1
asl.w #3,d0
add.w d0,a0
muls #(256/8),d0
add.l d0,a2 ; pointer to screen line.
subq #1,d1
blt NOPOLYGONSHAD
DOAHORLINESHAD:
swap d1
move.w RIGHTUVS-LEFTUVS(a0),d0
move.w (a0)+,d7
sub.w d7,d0
blt NOPOLYGONSHAD
move.l a2,-(a7)
; asr.w #2,d0
; asr.w #2,d7
add.w d7,a2
ext.l d0
addq #1,d0
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d5
swap d5
clr.w d5
sub.l d5,d7
divs.l d0,d7
move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
move.l d7,a3
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes
and.w #$7fff,d7
add.l #65536,a0
.okaddtes:
add.w d7,a0
move.w #0,d7
subq #1,d0
; d0=xdist
; d4=U a5=DU
; d5=V a6=DV
; d6=Y a3=DY
moveq #0,d1
swap d6
PLOTADOT:
.across
swap d4
swap d5
move.w d4,d2
lsl.w #8,d2
swap d4
move.b d5,d2
add.l a5,d4
swap d5
add.l a6,d5
; swap d6
; move.b (a2)+,d1
tst.b (a0,d2.w*4)
beq.s .noplottt
move.b d6,(a2)+
dbra d0,.across
bra.s .plaster
.noplottt:
addq #1,a2
dbra d0,.across
.plaster:
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
.noline:
add.w #256,a2
swap d1
dbra d1,DOAHORLINESHAD
NOPOLYGONSHAD:
SHADpolybehind:
rts
************************************************
LU: dc.w 0
LV: dc.w 0
RU: dc.w 0
RV: dc.w 0
SIMPLESHADLINE:
move.l #SHADOWPTS,a1
move.l #UVCOORDS,a2
move.w (a2,d0.w*4),LU
move.w 2(a2,d0.w*4),LV
move.w (a2,d1.w*4),RU
move.w 2(a2,d1.w*4),RV
muls #10,d0
muls #10,d1
move.w 8(a1,d0.w),d2 ;fz
move.w 8(a1,d1.w),d7 ;sz
ext.l d2
ext.l d7
move.l #LEFTUVS,a3
asr.l #2,d2
asr.l #2,d7
cmp.l d2,d7
beq .noline
bgt.s .lineonright
.lineonleft:
move.l #RIGHTUVS,a3
exg d0,d1
exg d2,d7
move.l LU,d5
move.l RU,LU
move.l d5,RU
.lineonright:
sub.w d2,d7
add.w #128,d2
lea (a3,d2.w*8),a3
move.w d7,YDIFF
move.l (a1,d0.w),d3 ;fx
move.l (a1,d1.w),d7 ;sx
asl.l #5,d3
asl.l #5,d7
sub.l d3,d7
divs.l YDIFF-2,d7
move.l d7,a0 ; dx
move.l #ROTATEDPTS,a1
move.w LU,d4
move.w LV,d5
move.w RU,d6
move.w RV,d7
sub.w d4,d6
sub.w d5,d7
swap d4
swap d5
clr.w d4
clr.w d5
swap d6
swap d7
clr.w d6
clr.w d7
divs.l YDIFF-2,d6
divs.l YDIFF-2,d7
move.l d6,a4
move.l d7,a5
; asl.w #4,d0
; asl.w #4,d1
move.l 4(a1,d0.w),d6
move.l 4(a1,d1.w),d7
asl.l #5,d6
asl.l #5,d7
sub.l d6,d7
divs.l YDIFF-2,d7
exg d7,a6
exg d7,d6
move.l YDIFF-2,d1
subq #1,d1
; d3=x a0=dx
; d4=u a4=du
; d5=v a5=dv
; d7=y a6=dy
; d1=dz
move.w HIGHPOLY,d7
add.l #128*65536,d3
; add.l #128*65536,d7
.PUTINLINE:
swap d3
move.w d3,(a3)+
swap d3
add.l a0,d3
swap d4
move.w d4,(a3)+
swap d4
swap d5
add.l a4,d4
move.w d5,(a3)+
swap d5
add.l a5,d5
; swap d7
move.w d7,(a3)+
; swap d7
; add.l a6,d7
dbra d1,.PUTINLINE
.noline:
rts
**************************************************
doapoly:
move.w (a1)+,d7 ; sides to draw
addq #2,a1 ; avoid holes
move.w 12(a1,d7.w*4),pregour
move.l #ONSCREENPTS,a3
move.w (a1),d0
move.w 4(a1),d1
move.w 8(a1),d2
move.w 2(a3,d0.w*4),d3
move.w 2(a3,d1.w*4),d4
move.w 2(a3,d2.w*4),d5
move.w (a3,d0.w*4),d0
move.w (a3,d1.w*4),d1
move.w (a3,d2.w*4),d2
sub.w d1,d0
sub.w d1,d2
sub.w d4,d3
sub.w d4,d5
muls d3,d2
muls d5,d0
sub.l d0,d2
ble polybehind
move.w #20000,d4 ; top
move.w #-20000,d5 ; bottom
move.l #UVCOORDS,a4
move.l a1,a0
putinlines:
move.w (a1),d0
move.w 4(a1),d1
moveq #0,d2
move.b 2(a1),d2 ; one end U
move.w d2,2(a4,d0.w*4)
move.b 3(a1),d2 ; one end V
move.w d2,(a4,d0.w*4)
move.b 6(a1),d2 ; two end U
move.w d2,2(a4,d1.w*4)
move.b 7(a1),d2 ; two end V
move.w d2,(a4,d1.w*4)
move.w 2(a3,d0.w*4),d2 ; Z
cmp.w d2,d4
ble.s .oktop
move.w d2,d4
.oktop
cmp.w d2,d5
bge.s .okbot
move.w d2,d5
.okbot
movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
jsr SIMPLECALCLINE
movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
addq #4,a1
dbra d7,putinlines
addq #4,a1
move.w (a1)+,TEXTUREADD
asr.w #2,d4
asr.w #2,d5
; add.w #128,d4
; add.w #128,d5
move.w d4,TOPLINE
move.w d5,BOTLINE
move.l #SHADOWPTS,a1
move.w (a0),d0
move.w 4(a0),d1
move.w 8(a0),d2
CHECKVALS:
muls #10,d0
muls #10,d1
muls #10,d2
lea (a1,d0.w),a0
lea (a1,d2.w),a2
lea (a1,d1.w),a1
move.l (a0),d3
sub.l (a1),d3
asr.l #8,d3
asr.l #1,d3
move.l 4(a0),d4
sub.l 4(a1),d4
asr.l #8,d4
asr.l #1,d4
move.w 8(a0),d5
sub.w 8(a1),d5
move.w d3,d6
muls d6,d6
move.w d4,d7
muls d7,d7
add.l d7,d6
move.w d5,d7
muls d7,d7
add.l d7,d6
move.l d6,d2
jsr CALCSQROOT
move.w d2,LEN1
move.l (a2),d0
sub.l (a1),d0
asr.l #8,d0
asr.l #1,d0
move.l 4(a2),d1
sub.l 4(a1),d1
asr.l #8,d1
asr.l #1,d1
move.w 8(a2),d2
sub.w 8(a1),d2
muls d2,d3
muls d0,d5
sub.l d3,d5 ; length
muls.l #$4c,d5
muls d0,d0
muls d1,d1
muls d2,d2
add.l d0,d1
add.l d1,d2
jsr CALCSQROOT
muls LEN1,d2
bgt.s .ok
moveq #1,d2
.ok
divs.l d2,d5
add.l #16,d5
tst.l d5
ble.s .okbr
moveq #0,d5
.okbr:
add.w #$3c,d5
bge.s .okbr2
moveq #0,d5
.okbr2:
move.w d5,d0
asl.w #8,d5
move.w d5,BRIGHTNESS+2
sub.w #$3c,d0
asr.w #1,d0
add.w #$3c,d0
asl.w #8,d0
move.w d0,BRIGHTNESS
***********************************************
* Draw the polygon (shadowed).
move.l FASTBUFFER,a2
move.l #LEFTUVS,a0
move.w TOPLINE,d0
move.w BOTLINE,d1
sub.w d0,d1
asl.w #4,d0
add.w d0,a0
muls #(320/16),d0
add.l d0,a2 ; pointer to screen line.
subq #1,d1
blt NOPOLYGON
tst.b Gouraud
bne GOURPOLY
DOAHORLINE:
swap d1
move.w RIGHTUVS-LEFTUVS(a0),d0
move.w (a0)+,d7
asr.w #2,d0
asr.w #2,d7
sub.w d7,d0
bge.s .okflibble
add.w #14,a0
add.w #320,a2
swap d1
dbra d1,DOAHORLINE
bra NOPOLYGON
.okflibble:
move.l a2,-(a7)
add.w d7,a2
ext.l d0
addq #1,d0
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d2
sub.l d2,d7
divs.l d0,d7
move.l d7,a1
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d3
sub.l d3,d7
divs.l d0,d7
move.l d7,a4
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d5
swap d5
clr.w d5
sub.l d5,d7
divs.l d0,d7
move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
move.l d7,a3
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes
and.w #$7fff,d7
add.l #65536,a0
.okaddtes:
add.w d7,a0
move.w #0,d7
move.l BRIGHTNESS,a6
move.l a7,SAVESTACK
move.l #SHADOWBUFFER,a7
subq #1,d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
move.w HIGHPOLY,d5
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTHELIGHT
bra.s INTHEDARK
PENUMBRA:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTOLIGHT
bra.s INTODARK
INTHEDARK:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble.s INTOPENUM
INTODARK:
move.w #$3c00,d7
swap d2
move.w d2,d1
asl.w #8,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
beq.s .noplottt
move.b TEXTUREPAL-256(pc,d7.w),(a2)+
dbra d0,INTHEDARK
bra.s PASTAC
.noplottt
addq #1,a2
dbra d0,INTHEDARK
bra.s PASTAC
INTOPENUM:
move.l a6,d7
swap d7
swap d2
move.w d2,d1
asl.w #8,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
beq.s .noplottt
move.b TEXTUREPAL(pc,d7.w),(a2)+
dbra d0,PENUMBRA
bra.s PASTAC
.noplottt
addq #1,a2
dbra d0,PENUMBRA
bra.s PASTAC
INTHELIGHT:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
bgt.s INTOPENUM
INTOLIGHT:
move.w a6,d7
swap d2
move.w d2,d1
asl.w #8,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
beq.s .noplottt
move.b TEXTUREPAL(pc,d7.w),(a2)+
dbra d0,INTHELIGHT
bra.s PASTAC
.noplottt:
addq #1,a2
dbra d0,INTHELIGHT
PASTAC
move.l SAVESTACK,a7
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
.noline:
add.w #320,a2
swap d1
dbra d1,DOAHORLINE
bra NOPOLYGON
TEXTUREPAL: incbin "ab3:includes/shadow.pal"
SAVESTACK: dc.l 0
HIGHPOLY: dc.w 0
LEN1: dc.w 0
BRIGHTNESS: dc.l 0
TRANSTEXT: dc.w 0
AANG: dc.w 0
BANG: dc.w 0
CANG: dc.w 0
DANG: dc.w 0
NOPOLYGON:
polybehind:
rts
GOURPOLY:
DOAHORLINEGOUR:
swap d1
move.w RIGHTUVS-LEFTUVS(a0),d0
move.w (a0)+,d7
asr.w #2,d0
asr.w #2,d7
sub.w d7,d0
bge.s .okflibble
add.w #14,a0
add.w #320,a2
swap d1
dbra d1,DOAHORLINEGOUR
bra NOPOLYGON
.okflibble:
move.l a2,-(a7)
add.w d7,a2
ext.l d0
addq #1,d0
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d2
moveq #0,d3
moveq #0,d5
move.w d2,d3
move.w d7,d5
swap d3
swap d5
sub.l d3,d5
divs.l d0,d5
asr.l #8,d5
move.w d5,RIGHTBRIGHT
asr.l #8,d3
move.w d3,LEFTBRIGHT
clr.w d2
clr.w d7
sub.l d2,d7
asl.l #8,d2
divs.l d0,d7
asl.l #8,d7
move.l RIGHTUVS-LEFTUVS(a0),d6
move.l (a0)+,d3
moveq #0,d4
moveq #0,d5
move.w d6,d5
move.w d3,d4
swap d5
swap d4
sub.l d4,d5
divs.l d0,d5
asr.l #8,d4
asr.l #8,d5
move.w d4,d2
ext.l d5
move.w d5,d7
move.l d7,a1
clr.w d3
clr.w d6
sub.l d3,d6
divs.l d0,d6
move.l d6,a4
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
; move.w RIGHTUVS-LEFTUVS(a0),d7
; swap d7
; clr.w d7
move.w (a0)+,d5
; swap d5
; clr.w d5
; sub.l d5,d7
; divs.l d0,d7
; move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
move.l d7,a3
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes
and.w #$7fff,d7
add.l #65536,a0
.okaddtes:
add.w d7,a0
move.w #0,d7
move.l RIGHTBRIGHT,a6
move.w LEFTBRIGHT,d5
swap d5
move.l a7,SAVESTACK
move.l #SHADOWBUFFER,a7
subq #1,d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
move.w HIGHPOLY,d5
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTHELIGHTGOUR
bra.s INTHEDARKGOUR
PENUMBRAGOUR:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
add.l a6,d5
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTOLIGHTGOUR
bra.s INTODARKGOUR
INTHEDARKGOUR:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
add.l a6,d5
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble.s INTOPENUMGOUR
INTODARKGOUR:
move.w #$3c00,d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
bne.s DARKplottt
.noplottt
addq #1,a2
dbra d0,INTHEDARKGOUR
bra PASTACGOUR
INTOPENUMGOUR:
move.l d5,d7
swap d7
sub.w #$3c00,d7
asr.w #1,d7
add.w #$3c00,d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
bne.s PENUMplottt
.noplottt
addq #1,a2
dbra d0,PENUMBRAGOUR
bra PASTACGOUR
PENUMplottt
move.w d2,d1
move.b GOURPAL(pc,d7.w),d1
move.b GOURPAL(pc,d7.w),(a2)+
dbra d0,PENUMBRAGOUR
bra PASTACGOUR
DARKplottt
move.w d2,d1
add.w #256,d1
move.b GOURPAL(pc,d7.w),d1
move.b GOURPAL(pc,d7.w),(a2)+
dbra d0,INTHEDARKGOUR
bra PASTACGOUR
INTHELIGHTGOUR:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
add.l a6,d5
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
bgt.s INTOPENUMGOUR
INTOLIGHTGOUR:
move.l d5,d7
swap d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
beq.s .noplottt
move.w d2,d1
move.b GOURPAL(pc,d7.w),d1
move.b GOURPAL(pc,d1.w),(a2)+
dbra d0,INTHELIGHTGOUR
bra PASTACGOUR
.noplottt:
addq #1,a2
dbra d0,INTHELIGHTGOUR
bra PASTACGOUR
GOURPAL: incbin "ab3:includes/shadow.pal"
PASTACGOUR:
move.l SAVESTACK,a7
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
.noline:
add.w #320,a2
swap d1
dbra d1,DOAHORLINEGOUR
bra NOPOLYGON
********************************************
***********************************
***************************
*******************
DORIGHTLEFT:
add.w d0,a2
add.l d7,d2
neg.l d7
add.w d5,d4
neg.w d5
move.w d4,d2
move.w d5,d7
move.l d7,a1
exg d3,d6
clr.w d3
clr.w d6
sub.l d3,d6
divs.l d0,d6
move.l d6,a4
move.w LEFTBRIGHT,d6
move.w RIGHTBRIGHT,d7
add.w d7,d6
neg.w d6
move.w d6,LEFTBRIGHT
move.w d7,RIGHTBRIGHT
move.w RIGHTUVS-LEFTUVS(a0),d4
move.w (a0)+,d7
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
move.w RIGHTUVS-LEFTUVS(a0),d5
swap d5
clr.w d5
move.w (a0)+,d7
swap d7
clr.w d7
sub.l d5,d7
divs.l d0,d7
move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d6
swap d6
clr.w d6
move.w (a0)+,d7
swap d7
clr.w d7
sub.l d6,d7
divs.l d0,d7
swap d7
move.l d7,a3
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes
and.w #$7fff,d7
add.l #65536,a0
.okaddtes:
add.w d7,a0
move.w #0,d7
move.l RIGHTBRIGHT,a6
move.w LEFTBRIGHT,d5
swap d5
move.l a7,SAVESTACK
move.l #SHADOWBUFFER,a7
subq #1,d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
move.w HIGHPOLY,d5
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTHELIGHTGOURRL
bra.s INTHEDARKGOURRL
PENUMBRAGOURRL:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
add.l a6,d5
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTOLIGHTGOURRL
bra.s INTODARKGOURRL
INTHEDARKGOURRL:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
add.l a6,d5
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble.s INTOPENUMGOURRL
INTODARKGOURRL:
move.w #$3c00,d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
bne.s DARKplotttRL
.noplottt
subq #1,a2
dbra d0,INTHEDARKGOURRL
bra PASTACGOUR
INTOPENUMGOURRL:
move.l d5,d7
swap d7
sub.w #$3c00,d7
asr.w #1,d7
add.w #$3c00,d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
bne.s PENUMplotttRL
.noplottt
subq #1,a2
dbra d0,PENUMBRAGOURRL
bra PASTACGOUR
PENUMplotttRL
move.w d2,d1
move.b GOURPALRL(pc,d7.w),d1
move.b GOURPALRL(pc,d1.w),-(a2)
dbra d0,PENUMBRAGOUR
bra PASTACGOUR
DARKplotttRL
move.w d2,d1
add.w #256,d1
move.b GOURPALRL(pc,d7.w),d1
move.b GOURPALRL(pc,d1.w),-(a2)
dbra d0,INTHEDARKGOURRL
bra PASTACGOUR
INTHELIGHTGOURRL:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
add.l a6,d5
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
bgt.s INTOPENUMGOURRL
INTOLIGHTGOURRL:
move.l d5,d7
swap d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b (a0,d1.w*4),d7
beq.s .noplottt
move.w d2,d1
move.b GOURPALRL(pc,d7.w),d1
move.b GOURPALRL(pc,d1.w),-(a2)
dbra d0,INTHELIGHTGOURRL
bra PASTACGOUR
.noplottt:
subq #1,a2
dbra d0,INTHELIGHTGOURRL
bra PASTACGOUR
GOURPALRL: incbin "ab3:includes/shadow.pal"
TOPPTR: dc.l 0
TOPPTNUM: dc.w 0
BOTPTNUM: dc.w 0
LEFTBRIGHT: dc.w 0
RIGHTBRIGHT: dc.l 0
LEFTSPEC: dc.w 0
RIGHTSPEC: dc.w 0
***********************************************
SIMPLECALCLINE:
move.l #ONSCREENPTS,a1
move.w 2(a1,d0.w*4),d2 ;fy
move.w 2(a1,d1.w*4),d7 ;sy
move.l #RIGHTUVS,a3
asr.w #2,d2
asr.w #2,d7
cmp.w d2,d7
beq .noline
bgt.s .lineonright
.lineonleft:
move.l #LEFTUVS,a3
exg d0,d1
exg d2,d7
.lineonright:
move.w d0,TOPPTNUM
move.w d1,BOTPTNUM
sub.w d2,d7
asl.w #4,d2
add.w d2,a3
move.l a3,TOPPTR
move.w d7,YDIFF
move.w (a1,d0.w*4),d3 ;fx
move.w (a1,d1.w*4),d7 ;sx
sub.w d3,d7
swap d3
swap d7
clr.w d3
clr.w d7
divs.l YDIFF-2,d7
move.l d7,a0 ; dx
move.l #UVCOORDS,a2
move.l #SHADOWPTS,a1
move.w (a2,d0.w*4),d4
move.w 2(a2,d0.w*4),d5
move.w (a2,d1.w*4),d6
move.w 2(a2,d1.w*4),d7
sub.w d4,d6
sub.w d5,d7
swap d4
swap d5
clr.w d4
clr.w d5
swap d6
swap d7
clr.w d6
clr.w d7
divs.l YDIFF-2,d6
divs.l YDIFF-2,d7
move.l d6,a4
move.l d7,a5
muls #10,d0
muls #10,d1
move.l (a1,d0.w),d6
move.l (a1,d1.w),d7
asl.l #5,d6
asl.l #5,d7
sub.l d6,d7
divs.l YDIFF-2,d7
move.l d7,a2
move.l d6,a6
move.l 4(a1,d0.w),d6
move.l 4(a1,d1.w),d7
asl.l #5,d6
asl.l #5,d7
sub.l d6,d7
divs.l YDIFF-2,d7
exg d7,a6
exg d7,d6
move.w 8(a1,d0.w),d0
move.w 8(a1,d1.w),d1
swap d0
swap d1
clr.w d0
clr.w d1
asr.l #2,d0
asr.l #2,d1
sub.l d0,d1
divs.l YDIFF-2,d1
move.l d1,a1
move.l YDIFF-2,d1
subq #1,d1
; d3=sx a0=dsx
; d4=u a4=du
; d5=v a5=dv
; d6=x a2=dx
; d7=y a6=dy
; d0=z a1=dz
; d1=dsy
add.l #128*65536,d6
add.l #128*65536,d7
add.l #128*65536,d0
.PUTINLINE:
swap d3
move.w d3,(a3)+
swap d3
add.l a0,d3
move.l d4,(a3)+
add.l a4,d4
move.l d5,(a3)+
swap d6
add.l a5,d5
move.w d6,(a3)+
swap d6
swap d7
add.l a2,d6
move.w d7,(a3)+
swap d7
swap d0
add.l a6,d7
move.w d0,(a3)+
swap d0
add.l a1,d0
dbra d1,.PUTINLINE
tst.b Gouraud
beq .noline
move.w TOPPTNUM,d0
move.w BOTPTNUM,d1
move.l TOPPTR,a3
moveq #0,d4
move.w YDIFF,d4
move.l #SPECBRIGHTS,a2
move.w (a2,d0.w*2),d2
move.w (a2,d1.w*2),d3
move.l #NORMBRIGHTS,a2
move.w (a2,d0.w*2),d0
move.w (a2,d1.w*2),d1
sub.w d0,d1
swap d1
swap d0
clr.w d0
clr.w d1
divs.l d4,d1
sub.w d2,d3
swap d2
swap d3
clr.w d2
clr.w d3
divs.l d4,d3
subq #1,d4
.STICKINGOUR:
swap d0
move.w d0,4(a3)
swap d0
add.l d1,d0
swap d2
move.w d2,8(a3)
adda.w #16,a3
swap d2
add.l d3,d2
dbra d4,.STICKINGOUR
.noline:
rts
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
move.w d3,TOPLINE
move.w d4,BOTLINE
*********************************************
CALCSQROOT:
tst.l d2
beq .oksqr
movem.l d0/d1/d3-d7/a0-a6,-(a7)
move.w #31,d0
.findhigh
btst d0,d2
bne .foundhigh
dbra d0,.findhigh
.foundhigh
asr.w #1,d0
clr.l d3
bset d0,d3
move.l d3,d0
move.w d0,d1
muls d1,d1 ; x*x
sub.l d2,d1 ; x*x-a
asr.l #1,d1 ; (x*x-a)/2
divs d0,d1 ; (x*x-a)/2x
sub.w d1,d0 ; second approx
bgt .stillnot0
move.w #1,d0
.stillnot0
move.w d0,d1
muls d1,d1
sub.l d2,d1
asr.l #1,d1
divs d0,d1
sub.w d1,d0 ; second approx
bgt .stillnot02
move.w #1,d0
.stillnot02
move.w d0,d1
muls d1,d1
sub.l d2,d1
asr.l #1,d1
divs d0,d1
sub.w d1,d0 ; second approx
bgt .stillnot03
move.w #1,d0
.stillnot03
move.w d0,d2
ext.l d2
movem.l (a7)+,d0/d1/d3-d7/a0-a6
.oksqr
rts
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
********************** ************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
TOPLINE: dc.w 0
BOTLINE: dc.w 0
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
dc.w 0
YDIFF: dc.w 0
SPINAROUND: dc.w 0
XCOS: dc.w 0
YCOS: dc.w 0
XSIN: dc.w 0
YSIN: dc.w 0
XCOS3: dc.w 0
YCOS3: dc.w 0
XSIN3: dc.w 0
YSIN3: dc.w 0
XCOS2: dc.w 0
YCOS2: dc.w 0
XSIN2: dc.w 0
YSIN2: dc.w 0
XADD: dc.l 0
YADD: dc.l 0
ZADD: dc.l 0
XOFF: dc.w 0
YOFF: dc.w 0
OLDXM: dc.w 0
OLDYM: dc.w 0
TEXTUREADD: dc.w 0
**********************************************************
UVCOORDS: ds.l 250
ROTATEDPTS: ds.l 250*4
SHADOWPTS: ds.l 250*4
ONSCREENPTS: ds.l 250
ZOFF: dc.w 768
LEFTRIGHT: ds.l 256
POLYGONDATA:
incbin "ab3:vectobj/testcube"
****************************
SINETABLE:
incbin "ab3:includes/bigsine"
YANG: dc.w 0
XANG: dc.w 0
xmouse: dc.w 0
ymouse: dc.w 0
spleen: dc.w 0
lastspleen: dc.w 0
COPIEDPAL:
dc.w 256,0
ds.l 3*256
ds.l 10
SHADOWBUFFER: ds.l 65536/4
PALETTEBIT:
; incbin "256palette"
; dc.w $ffff,$fffe
incbin "ab3:includes/256pal"
include "ab3:source_4000/chunky.s"
willy: ds.w 48
PALS:
ds.l 2*49
pregour: dc.b 0
Gouraud: dc.b 0
PointAngPtr: dc.l 0
FRAMENUM: dc.w 0
PolyAngPtr: dc.l 0
PtsPtr: dc.l 0
LinesPtr: dc.l 0
POINTER_TO_POINTERS: dc.l 0
FRAME: dc.w 4
FLIBBLE: dc.w 0
START_OF_OBJECT: dc.l 0
num_points: dc.w 0
num_frames: dc.w 0
SORTIT: dc.w 0
PartBuffer: ds.l 2*32
endparttab:
x1: dc.w 0
y1: dc.w 0
z1: dc.w 0
x2: dc.w 0
y2: dc.w 0
z2: dc.w 0
x2b: dc.w 0
y2b: dc.w 0
z2b: dc.w 0
x3: dc.w 0
y3: dc.w 0
z3: dc.w 0
l1: dc.w 0
l2: dc.w 0
OBJONOFF: dc.l 0
SAVEHIGHS: ds.w 30
FASTBUFFER:
dc.l fasty
fasty: ds.b 320*256
NORMBRIGHTS: ds.w 250
SPECBRIGHTS:
dcb.l 100,31
ENDNORM:
LEFTUVS: ds.w 8*256
RIGHTUVS: ds.w 8*256
NORMVECTS: ds.w 3*250
;WORLD: incbin "ab3:includes/world"
;TWEEN: incbin "ab3:includes/tweenbrightfile"
TEXTURES: incbin "ab3:includes/newtexturemaps"
NEBBIE: incbin "work:temp/nebbieroar"
ds.l (192/4)*16
SECTION BGDROP,code_c
RAWSCRN:
ds.l 2560*8